package controller;
  
import java.util.List; 

import org.hibernate.HibernateException;
import org.hibernate.Session;
import util.HibernateUtil;
import model.KlsConductor;
import model.KlsEstadoConductor;
import model.KlsUsuario;


 
public class KlsConductorManager extends HibernateUtil {
	
	private KlsEstadoConductor klsEstadoConductor;
	private KlsUsuario klsUsuarioCreador;
	private KlsUsuario klsUsuarioModificador;
	
	
 
    public KlsConductor add(KlsConductor conductor, int idEstadoConductor, int idUsuarioCreador, int idUsuarioModificador) {
    	    	
    	cargarObjetosRelacionados(idEstadoConductor, idUsuarioCreador, idUsuarioModificador);
    	
    	conductor.setKlsEstadoConductor(klsEstadoConductor);
    	conductor.setKlsUsuarioByIdUsuarioCreador(klsUsuarioCreador);
    	conductor.setKlsUsuarioByIdUsuarioModificador(klsUsuarioModificador);
    	   	
    	
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
			session.beginTransaction();
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
        try {
        session.save(conductor);
        session.getTransaction().commit();
        }
        catch (HibernateException e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }    
        
        return conductor;
    }

    public KlsConductor delete(int idConductor) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        KlsConductor conductor = (KlsConductor) session.load(KlsConductor.class, idConductor);
        if(null != conductor) {
            
        	try {
        	session.delete(conductor);
        	session.getTransaction().commit();
        	}
        	catch (HibernateException e) {
                e.printStackTrace();
                session.getTransaction().rollback();
            }
        }
        
        return conductor;
    }

    public KlsConductor update(KlsConductor conductor, int idEstadoConductor, int idUsuarioCreador, int idUsuarioModificador) {
    	
    	cargarObjetosRelacionados(idEstadoConductor, idUsuarioCreador, idUsuarioModificador);
    	
    	conductor.setKlsEstadoConductor(klsEstadoConductor);
    	conductor.setKlsUsuarioByIdUsuarioCreador(klsUsuarioCreador);
    	conductor.setKlsUsuarioByIdUsuarioModificador(klsUsuarioModificador);
    	    	
    	Session session = getSessionFactory().getCurrentSession();
        session.getTransaction().begin();
    	
    	try {
           	session.update(conductor);
           	session.getTransaction().commit();
    	}
        catch (HibernateException e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
        
        return conductor;
    }
       
	
	public List<KlsConductor> list() {
        
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        List<KlsConductor> conductor = null;
        try {
             
            conductor = session.createQuery("from KlsConductor").list();
            session.getTransaction().commit(); 
            
        } catch (HibernateException e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
        
        return conductor;
    }
    
	public List<KlsConductor> listPorEstado(int piEstado , boolean piBajaLogica ) {
        
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        List<KlsConductor> conductor = null;
        try {
             
            conductor = session.createQuery("from KlsConductor where klsEstadoConductor.idEstadoConductor = :estado and bajaLogica = :bajalogica")
            		.setParameter("estado", piEstado).setParameter("bajaLogica", piBajaLogica).list();
        	session.getTransaction().commit();
        	//TODO: Filtrar conductores segun estado perametro        	
             
        } catch (HibernateException e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
        
        return conductor;
    }
	
	
	
	   public KlsConductor load(int idConductor) {
	        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	        KlsConductor klsConductor = null;
	        try{
	        	klsConductor = (KlsConductor) session.get(KlsConductor.class, idConductor); 
	        	session.getTransaction().commit();
	        }
	        catch(Exception e)
	        {
	        	e.printStackTrace();
	        	session.getTransaction().rollback();
	        }
	        
	        return klsConductor;
	    }

	  
	   private void cargarObjetosRelacionados(int idEstadoConductor, int idUsuarioCreador, int idUsuarioModificador ) {
			//Managers para cargar objetos
			 KlsEstadoConductorManager klsEstadoConductorManager = new KlsEstadoConductorManager();
			 KlsUsuarioManager klsUsuarioManager = new KlsUsuarioManager();
			 			 
			//Cargar objetos relacionados
			setKlsEstadoConductor(klsEstadoConductorManager.load(idEstadoConductor));
		    setKlsUsuarioCreador(klsUsuarioManager.load(idUsuarioCreador));  
		    setKlsUsuarioModificador(klsUsuarioManager.load(idUsuarioModificador));
		    
		}

	public KlsEstadoConductor getKlsEstadoConductor() {
		return klsEstadoConductor;
	}

	public void setKlsEstadoConductor(KlsEstadoConductor klsEstadoConductor) {
		this.klsEstadoConductor = klsEstadoConductor;
	}

	public KlsUsuario getKlsUsuarioCreador() {
		return klsUsuarioCreador;
	}

	public void setKlsUsuarioCreador(KlsUsuario klsUsuarioCreador) {
		this.klsUsuarioCreador = klsUsuarioCreador;
	}

	public KlsUsuario getKlsUsuarioModificador() {
		return klsUsuarioModificador;
	}

	public void setKlsUsuarioModificador(KlsUsuario klsUsuarioModificador) {
		this.klsUsuarioModificador = klsUsuarioModificador;
	}

	
	   

}